<?php
/*
 * Uso
 * static function pk($sg_sis) {
 *   return Cache::get(__class__,$sg_sis,'no_tp_adesao','nu_seq_tp_adesao');
 * }
 */
class Cache
{
	static $cache;

	static function get($classe,$chave,$nome_chave,$nome_valor) {
		if(!$nome_valor) trigger_error('Precisa passar 4 args');
		$indice = $classe.'_'.$nome_chave.'_'.$nome_valor;
		if(!isset(self::$cache[$indice])) {
			self::carregarCache($indice,$classe,$nome_chave,$nome_valor);
		}
		if(array_key_exists($chave,self::$cache[$indice])) {
			return self::$cache[$indice][$chave];
		}
		else {
			echo "<pre>";
			print_r(self::$cache[$indice]);
			trigger_error('ERRO DE CACHE::Não foi encontrado o valor de '.$chave.' no cache de '.$nome_chave.'->'.$nome_valor.' da tabela '.$classe,E_USER_ERROR);
		}
	}

	static function getList($classe,$nome_chave,$nome_valor) {
		$indice = $classe.'_'.$nome_chave.'_'.$nome_valor;
		if(!isset(self::$cache[$indice])) {
			self::carregarCache($indice,$classe,$nome_chave,$nome_valor);
		}
		return self::$cache[$indice];
	}

	static function carregarCache($indice,$classe,$nome_chave,$nome_valor) {
		//verifica no disco
		$arquivo = sfConfig::get('sf_config_cache_dir').DIRECTORY_SEPARATOR.'fnde_cache_'.$indice.'.cache.php';
		if(self::existeArquivo($arquivo,$indice)) {
			self::lerArquivo($arquivo,$indice);
		}
		// lê do banco e grava em disco
		else {
			self::lerBanco($indice,$classe,$nome_chave,$nome_valor);
			self::gravarArquivo($arquivo,$indice);
		}
	}

	static function lerBanco($indice,$classe,$nome_chave,$nome_valor) {
		$ar = $consulta = Doctrine_Query::create()
		->select('s.'.$nome_chave.', s.'.$nome_valor)
		->from($classe.' s')
		->execute(array(),Doctrine::FETCH_ARRAY);
		foreach($ar as $campos) {
			self::$cache[$indice][$campos[$nome_chave]] = $campos[$nome_valor];
		}
	}

	static function existeArquivo($arquivo,$indice) {
		return file_exists($arquivo);
	}

	static function lerArquivo($arquivo,$indice) {
		self::$cache[$indice] = include($arquivo);
	}

	static function gravarArquivo($arquivo,$indice) {
		$include = '<?php return array(';
		if(is_array(self::$cache[$indice])) {
			foreach(self::$cache[$indice] as $k=>$v) {
				$include .="'$k'=>'$v',\n";
			}
		}
		$include .= ');?>';
		file_put_contents($arquivo,$include);
	}
}
?>